#where store
#fields: stuff, location, store_type, user_id
class WhereStore < ActiveRecord::Base

  belongs_to :user
  validates_presence_of :stuff, :location, :store_type, :user_id

  STORE_TYPE_LEND="借给"
  STORE_TYPE_PRESENT="送给"
  STORE_TYPE_PLACE="放在"

  STORE_TYPE_ALL=[WhereStore::STORE_TYPE_LEND,WhereStore::STORE_TYPE_PRESENT,WhereStore::STORE_TYPE_PLACE]

  STORE_PREFIX="把"
  STUFF_PREFIX="所有东西"
  MY_STUFF_PREFIX="我的所有东西"
  STUFF_PREFIX_ALL=[WhereStore::STUFF_PREFIX,WhereStore::MY_STUFF_PREFIX]

  FRIEND_PREFIX="所有朋友"
  MY_FRIEND_PREFIX="我的所有朋友"

  FRIEND_PREFIX_ALL=[WhereStore::FRIEND_PREFIX,WhereStore::MY_FRIEND_PREFIX]

  HELP_COMMAND_ALL=["help","帮助"]

  SEARCH_COMMAND="在哪里"
  
  AGAIN_COMMAND="重复"

  FULL_BLANK="　"

  REGISTER_COMMAND="注册"

  def self.invalid_command()
    return <<STRINGEND
命令格式不对，请参照以下帮助：
#{help_msg()}
STRINGEND

  end

  def self.help_msg()
    return <<STRINGEND
欢迎使用"在哪里"
描述东西在哪里的命令格式有三种：
1.[#{STORE_PREFIX}]<东西>#{STORE_TYPE_LEND}<某人>
例： 把钢笔借给小明
2.[#{STORE_PREFIX}]<东西>#{STORE_TYPE_PRESENT}<某人>
例： 把钢笔送给小明
3.[#{STORE_PREFIX}]<东西>#{STORE_TYPE_PLACE}<某地>
例： 把钢笔放在抽屉里

查询东西：<东西>在哪里[？]
例：钢笔在哪里？

查询朋友：[我的]朋友 <朋友名或邮件地址>
例：我的朋友 小明

查询所有东西：[我的]所有东西
查询所有朋友：[我的]所有朋友

STRINGEND

  end

  def self.start_with?(str,prefix_arr)
    prefix_arr.each() do |prefix|
      prefix = prefix.to_s
      return true if str[0, prefix.length] == prefix
    end
    return false
  end

  def self.strip_full(str)
    str.to_s().strip().sub(/^#{WhereStore::FULL_BLANK}/,"").sub(/#{WhereStore::FULL_BLANK}$/,"")
  end

  def self.contain?(str,sub)
    sub.each() do |s|
      if str=~/#{s}/
        return true
      end
    end
    return false
  end

  def self.remove_store_prefix(str)
    str.sub(/^#{WhereStore::STORE_PREFIX}/,"")
  end

  def self.split_store_type(str)
    str=remove_store_prefix(str)
    t, rlt= WhereStore::STORE_TYPE_LEND, str.split(WhereStore::STORE_TYPE_LEND)
    t, rlt=WhereStore::STORE_TYPE_PRESENT , str.split(WhereStore::STORE_TYPE_PRESENT) if rlt==nil || rlt.size==1
    t, rlt=WhereStore::STORE_TYPE_PLACE, str.split(WhereStore::STORE_TYPE_PLACE) if rlt==nil || rlt.size==1

    if rlt!=nil && rlt.size>1
      return {:stuff=>rlt[0],:location=>rlt[1],:store_type=>t}
    else
      return nil
    end

  end

  def self.save_where_store(attr,user)
    attr[:user_id]=user.id
    ws=WhereStore.new(attr)
    if ws.save
      return "#{ws.stuff} 已经 #{ws.store_type} #{ws.location}"
    else
      return nil
    end
  end

  def self.get_all_stuff_for_user(user)
    rlt=""
    WhereStore.find(:all,:conditions=>{:user_id=>user.id},:order=>"updated_at desc").each() do |w|
      rlt+="#{w.stuff} #{w.store_type} #{w.location}\n"
    end
    if rlt.empty?
      rlt="没有找到记录的东西，请使用命令来记录东西的位置，输入“帮助”两个将得到命令格式。"
    else
      rlt="您的东西有这些：\n#{rlt}"
    end
    return rlt
  end

  def self.get_all_friend_for_user(user)
    rlt=""
    WhereStore.find(:all,:select=>"location, count(id) as stuff_count",
        :conditions=>["user_id=? and store_type in (?,?)",user.id,STORE_TYPE_LEND,STORE_TYPE_PRESENT],
        :group=>"location").each() do |w|
      rlt+="#{w.location}:有 #{w.stuff_count} 件东西\n"
    end
    if rlt.empty?
      rlt="没有找到记录的朋友，请使用命令来记录东西借给或送给朋友，输入“帮助”两个将得到命令格式。"
    else
      rlt="您的朋友有这些：\n#{rlt}"
    end
    return rlt
  end

  def self.split_query(cmd)
    strip_full(cmd.split(WhereStore::SEARCH_COMMAND)[0])
  end

  def self.try_search_by_stuff(stuff,user)
    rlt=""
    WhereStore.find(:all,:conditions=>["user_id=? and stuff like ?",user.id,"%#{stuff}%"],
      :order=>"updated_at desc").each() do |w|
      rlt+="#{w.store_type} #{w.location}\n"
    end
    if !rlt.empty?
      rlt="#{stuff} 在以下这些地方：\n#{rlt}"
    end
    return rlt
  end

  def self.search_by_stuff(stuff,user)
    rlt=try_search_by_stuff(stuff,user)    
    if rlt.empty?
      rlt="没有找到 #{stuff}。您没有记录过或者是关键字错误"
    end
    return rlt
  end

  def self.process_command(cmd,user)
    if cmd!=nil
      cmd=strip_full(cmd)
#      Robot.debug_log("cmd:#{cmd} start_with:#{start_with?(cmd,WhereStore::STORE_PREFIX)} contain:#{contain?(cmd,WhereStore::STORE_TYPE_ALL)}")
      if start_with?(cmd,WhereStore::HELP_COMMAND_ALL)
        return help_msg
      elsif User.register_command?(cmd)
        return "已注册用户不需要再输入注册命令"
      elsif (start_with?(cmd,WhereStore::STORE_PREFIX) || contain?(cmd,WhereStore::STORE_TYPE_ALL))
        #start command perfix
        return_msg=save_where_store(split_store_type(cmd),user)
        if return_msg
          return "记录：#{return_msg}"
        else
          return "记录错误"
        end
      elsif start_with?(cmd,WhereStore::STUFF_PREFIX_ALL)
        return get_all_stuff_for_user(user)
      elsif start_with?(cmd,WhereStore::FRIEND_PREFIX_ALL)
        return get_all_friend_for_user(user)
      elsif contain?(cmd,WhereStore::SEARCH_COMMAND)
        return search_by_stuff(split_query(cmd),user)
      else
        rlt_msg=try_search_by_stuff(cmd,user)
        if rlt_msg && !rlt_msg.empty?
          return rlt_msg
        else
          return invalid_command
        end
      end
    end
  end

end
